package com.example.demo.services.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.port.fee.dao.CargoMapper;
import com.port.fee.entity.Cargo;
import com.port.fee.entity.Customer;
import com.port.fee.service.CargoService;
import com.port.fee.service.CustomerService;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Date;

/**
 * 货物服务实现类
 */
@Service
public class CargoServiceImpl extends ServiceImpl<CargoMapper, Cargo> implements CargoService {

    private static final Logger LOGGER = LoggerFactory.getLogger(CargoServiceImpl.class);

    @Autowired
    private CustomerService customerService;

    @Override
    public Page<Cargo> listCargos(Cargo cargo, int pageNum, int pageSize) {
        // 构建查询条件
        LambdaQueryWrapper<Cargo> queryWrapper = new LambdaQueryWrapper<>();

        // 根据货物名称模糊查询
        if (StringUtils.isNotBlank(cargo.getCargoName())) {
            queryWrapper.like(Cargo::getCargoName, cargo.getCargoName());
        }

        // 根据货物类型查询
        if (StringUtils.isNotBlank(cargo.getCargoType())) {
            queryWrapper.eq(Cargo::getCargoType, cargo.getCargoType());
        }

        // 根据货物编码查询
        if (StringUtils.isNotBlank(cargo.getCargoCode())) {
            queryWrapper.eq(Cargo::getCargoCode, cargo.getCargoCode());
        }

        // 根据客户ID查询
        if (cargo.getCustomerId() != null) {
            queryWrapper.eq(Cargo::getCustomerId, cargo.getCustomerId());
        }

        // 根据状态查询
        if (cargo.getStatus() != null) {
            queryWrapper.eq(Cargo::getStatus, cargo.getStatus());
        }

        // 按照创建时间降序排序
        queryWrapper.orderByDesc(Cargo::getCreateTime);

        // 分页查询
        return page(new Page<>(pageNum, pageSize), queryWrapper);
    }

    @Override
    public boolean addCargo(Cargo cargo) {
        try {
            LOGGER.info("开始添加货物，接收到的参数: {}", cargo);

            // 验证客户是否存在
            if (cargo.getCustomerId() != null) {
                LOGGER.info("验证客户ID: {}", cargo.getCustomerId());
                Customer customer = customerService.getCustomerById(cargo.getCustomerId());

                if (customer == null) {
                    LOGGER.error("添加货物失败：客户ID {} 不存在", cargo.getCustomerId());
                    throw new RuntimeException("指定的客户ID不存在，请选择有效的客户");
                } else {
                    LOGGER.info("客户验证通过: {}", customer.getCustomerName());
                }
            } else {
                LOGGER.error("客户ID为空");
                throw new RuntimeException("客户ID不能为空");
            }

            // 设置默认值
            if (cargo.getStatus() == null) {
                cargo.setStatus(1); // 默认在港状态
            }

            cargo.setCreateTime(new Date());
            cargo.setUpdateTime(new Date());

            LOGGER.info("保存货物信息: {}", cargo);
            boolean result = save(cargo);
            LOGGER.info("保存结果: {}", result);
            return result;
        } catch (Exception e) {
            LOGGER.error("添加货物异常: ", e);
            throw e;
        }
    }

    @Override
    public boolean updateCargo(Cargo cargo) {
        cargo.setUpdateTime(new Date());
        return updateById(cargo);
    }

    @Override
    public boolean deleteCargo(Long cargoId) {
        // 先检查货物是否存在
        Cargo cargo = getById(cargoId);
        if (cargo == null) {
            return false;
        }

        return removeById(cargoId);
    }

    @Override
    public Cargo getCargoById(Long cargoId) {
        return getById(cargoId);
    }

    @Override
    public boolean exitPort(Long cargoId, Date exitTime) {
        // 先检查货物是否存在
        Cargo cargo = getById(cargoId);
        if (cargo == null) {
            return false;
        }

        // 更新出港信息
        cargo.setExitTime(exitTime);
        cargo.setStatus(2); // 已出港状态
        cargo.setUpdateTime(new Date());

        return updateById(cargo);
    }
}